package com.zshan.clinic.admin.util;

import com.zshan.clinic.admin.entity.medical.schedule.TimeRange;

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author lichen
 */
public class ShiftUtil {

    /**
     * 判断时间段是否重合
     * @param timeRangeList
     * @return
     */
    public static boolean hasOverlap(List<TimeRange> timeRangeList) {
        // 排序后逐个比较是否存在交叉
        List<TimeRange> sortedList = timeRangeList.stream()
                .sorted(Comparator.comparing(TimeRange::getStart))
                .collect(Collectors.toList());

        for (int i = 0; i < sortedList.size() - 1; i++) {
            TimeRange current = sortedList.get(i);
            TimeRange next = sortedList.get(i + 1);
            if (current.getEnd().isAfter(next.getStart())) {
                // 有重叠（只在有交集时为 true，相邻不算）
                return true;
            }
        }
        return false;
    }


    /**
     * 判断请假的时间段在班次的时间段以内
     * @param leaveStartTime
     * @param leaveEndTime
     * @param shiftStartTime
     * @param shiftEndTime
     * @return
     */
    public static boolean isLeaveWithinShift(LocalTime leaveStartTime, LocalTime leaveEndTime,
                                             LocalTime shiftStartTime, LocalTime shiftEndTime) {
        if (leaveStartTime == null || leaveEndTime == null || shiftStartTime == null || shiftEndTime == null) {
            return false; // 任意时间为空都视为不合法
        }

        return !leaveStartTime.isBefore(shiftStartTime) && !leaveEndTime.isAfter(shiftEndTime);
    }


    /**
     * 获取被删除的时间段（原有但新时间段中没有的部分）
     *
     * @param oldStart 原开始时间
     * @param oldEnd   原结束时间
     * @param newStart 新开始时间
     * @param newEnd   新结束时间
     * @return List<TimeRange> 被删除的时间段列表
     */
    public static List<TimeRange> getReducedRanges(LocalTime oldStart, LocalTime oldEnd,
                                                   LocalTime newStart, LocalTime newEnd) {
        List<TimeRange> reducedList = new ArrayList<>();
        if (oldStart.isBefore(newStart)) {
            reducedList.add(new TimeRange(oldStart, newStart));
        }
        if (oldEnd.isAfter(newEnd)) {
            reducedList.add(new TimeRange(newEnd, oldEnd));
        }
        return reducedList;
    }
}
